package org.dromara.common.mybatis.util;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * 距离查询工具类
 *
 * @author zlj
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DistanceUtils {

    /**
     * 构建经纬度坐标距离查询语句
     *
     * @param lat   经度坐标
     * @param lng   维度坐标
     * @param isAll 是否查询所有字段 false:只查距离 true:查所有字段
     * @param <T>   泛型
     * @return 已经构建好的查询距离字段语句 查询结果封装到distance字段
     */
    public static <T> LambdaQueryWrapper<T> buildWrapper(String lat, String lng, Boolean isAll) {
        QueryWrapper<T> queryWrapper = new QueryWrapper<>();
        if (StrUtil.isNotBlank(lat) && StrUtil.isNotBlank(lng)) {
            String sql = "st_distance_sphere(point(" + lng + "," + lat + "),point(lng,lat)) distance";
            if (isAll) {
                sql = "*," + sql;
            }
            queryWrapper.select(sql);
        }
        return queryWrapper.lambda();
    }

    /**
     * 计算距离, 根据长度转化单位
     *
     * @param distance 单位 米
     * @return 转化好的距离
     */
    public static String getDistanceStr(String distance) {
        if (StrUtil.isBlank(distance)) {
            return "距离未知";
        }
        String res = "";
        BigDecimal value = new BigDecimal(distance);
        if (value.compareTo(new BigDecimal("1000")) >= 0) {
            res = value.divide(new BigDecimal("1000")).setScale(2, BigDecimal.ROUND_HALF_UP) + "km";
        } else {
            res = value.setScale(2, BigDecimal.ROUND_HALF_UP) + "m";
        }
        return res;
    }
}
